<?php
/**
 * mysql数据库操作类
 *
 * 用于进行mysql中的数据简化操作
 */

class mysql extends DB {
	//当前的数据库实例对象
	public $db = null;

	/**
	 * 数据库连接设置配置参数
	 *
	 * 用于设置最新的配置参数
	 *
	 * @param array 配置参数数组
	 * @return void
	 */
	
	protected function _setConfig($params) {
		$this->config = $params;
		
	}

	/**
	 * mysql中的连接操作
	 *
	 * 此函数将完成mysql的连接
	 *
	 * @param void
	 * @return void 保存的mysql数据库实例
	 */

	public function _connect() {
		try {
			$this->db = new PDO("mysql:host={$this->config['dbHost']};port={$this->config['dbPort']};dbname={$this->config['dbName']}", $this->config['dbUser'], $this->config['dbPwd'], array(PDO::ATTR_PERSISTENT => $this->config['persistent']));
			//设置编码为utf-8
			$this->db->exec("set names 'utf8';");
		}
		catch(PDOException $e) {
			//调用DB中的错误处理函数
			parent::errorHandle('mysql', $e);
		}
	}

	/**
	 * mysql中的插入操作
	 *
	 * 此函数将简化insert语句的插入操作，$data参数可以是一维或二维数组，二维数组将能够一次性插入多条数据
	 *
	 * @param string $insertTable 表名称 , string $insertFields 要插入的字段 , string $selectTable , string $selectFields , array $data 用于表数据复制操作的数据 , array $attrs 构造语句的属性
	 * @return int 复制了多少行
	 */

	protected function _insert($table, $fields, $data = array(), $attrs = array()) {
		$groups = array();
		$params = array(
			'ignore' => false,
			'table' => $table,
			'fields' => $fields,
			
		);
		foreach($attrs as $key => $val) {
			$params[$key] = $val;
		}
		if(is_array($data) && is_array($data[0])) {
			$_data = array();
			foreach($data as $d1) {
				foreach($d1 as $d2) {
					array_push($_data, $d2);
				}
				array_push($groups, count($d1));
			}
			$data = $_data;
		}
		else {
			array_push($groups, count($data));
		}
		$params['ignore'] = $params['ignore'] ? ' ignore ' : ' ';
		$params['table'] = ' ' . $params['table'];
		$params['fields'] = empty($params['fields']) ? ' ' : ('(' . str_replace(' ', '', $params['fields']) . ')');
		$group = '';
		$vals = '';
		//配对参数化查询的问号
		for($i = 0;$i < count($groups);$i++) {
			for($d = 0;$d < $groups[$i];$d++) {
				$vals .= ',?';
			}
			$group .= ',(' . ltrim($vals, ',') . ')';
			$vals = '';
		}
		$vals = 'values' . ltrim($group, ',');
		//showMsg("insert{$params['ignore']}into{$params['table']}{$params['fields']}{$vals};");
		$result = $this->_query("insert{$params['ignore']}into{$params['table']}{$params['fields']}{$vals};", $data, 'LINE');
		return $result;
	}

	/**
	 * mysql中的数据表复制操作
	 *
	 * 此函数将简化insertFrom操作，可以从另一张表使用select语句取出需要数据插入到指定表中
	 *
	 * @param string $insertTable 表名称 , string $insertFields 要插入的字段 , string $selectTable , string $selectFields , array $data 用于表数据复制操作的数据 , array $attrs 构造语句的属性
	 * @return int 复制了多少行
	 */

	protected function _insertFromTable($insertTable, $insertFields = '*', $selectTable, $selectFields = '*', $where = '', $data = array(), $attrs = array()) {
		$params = array(
			'ignore' => false,
			'insertTable' => $insertTable,
			'insertFields' => $insertFields,
			'selectTable' => $selectTable,
			'selectFields' => $selectFields,
			'where' => $where
		);
		foreach($attrs as $key => $val) {
			$params[$key] = $val;
		}
		$params['ignore'] = $params['ignore'] ? ' ignore ' : ' ';
		$params['insertTable'] = ' ' . $params['insertTable'];
		$params['insertFields'] = empty($params['insertFields']) ? ' ' : ('(' . str_replace(' ', '', $params['insertFields']) . ') ');
		$params['selectTable'] = ' ' . $params['selectTable'];
		$params['selectFields'] = ' ' . $params['selectFields'] . ' ';
		$params['where'] = ' where ' . $params['where'] . ' ';
		$result = $this->_query("insert{$params['ignore']}into{$params['insertTable']}{$params['insertFields']}select{$params['selectFields']}from{$params['selectTable']}{$params['where']}", $data, 'LINE');
		return $result;
	}

	/**
	 * mysql中的删除操作
	 *
	 * 此函数将简化delete操作，可以对表中数据进行删除操作
	 *
	 * @param string $table 表名称 , array $data 用于删除的数据 , array $attrs 构造函数的属性
	 * @return int 被删除了多少行
	 */

	public function _delete($table, $where = '', $data = array(), $attrs = array()) {
		$params = array(
			'ignore' => false,
			'table' => $table,
			'where' => $where
		);
		foreach($attrs as $key => $val) {
			$params[$key] = $val;
		}
		$params['ignore'] = $params['ignore'] ? ' ignore ' : ' ';
		$params['table'] = ' ' . $params['table'];
		$params['where'] = ' where ' . $params['where'] . ' ';
		//showMsg("delete{$params['ignore']}from{$params['table']}{$params['where']}");
		$result = $this->_query("delete{$params['ignore']}from{$params['table']}{$params['where']}", $data, 'LINE');
		return $result;
	}

	/**
	 * mysql中的查询操作
	 *
	 * 此函数将简化select语句的查询操作
	 *
	 * @param string $table 数据表名称 string $fields 需要查询到的字段 array $data 进行参数化查询的数据 array $attrs 组成select语句的各种元素
	 * @return array 查询到的结果
	 */

	protected function _select($table, $fields = '*', $where = '', $data = array(), $format = 'AS-AL', $attrs) {
		$params = array(
			'distinct' => '',
			'fields' => $fields,
			'table' => $table,
			'where' => $where,
			'sort' => '',
			'limit' => '',
			'format' => $format
		);
		foreach($attrs as $key => $val) {
			$params[$key] = $val;
		}
		$params['distinct'] = empty($params['distinct']) ? '' : ' distinct ';
		$params['fields'] = ' ' . $params['fields'] . ' ';
		$params['table'] = ' ' . $params['table'] . ' ';
		$params['where'] = empty($params['where']) ? ' ' : ' where ' . $params['where'] . ' ';
		$params['sort'] = empty($params['sort']) ? '' : ' order by ' . $params['sort'];
		$params['limit'] = empty($params['limit']) ? '' : ' limit ' . $params['limit'] . ' ';
		//showMsg('select' . $params['distinct'] . $params['fields'] . 'from' . $params['table'] . $params['where'] . $params['sort'] . $params['limit']);
		$result = $this->_query("select{$params['distinct']}{$params['fields']}from{$params['table']}{$params['where']}{$params['sort']}{$params['limit']}", $data, $params['format']);
		return $result;
	}

	/**
	 * mysql中的修改操作
	 *
	 * 此函数将简化update操作，对表内数据进行更改
	 *
	 * @param string $table 表名称 , string $updateFields 需要修改的字段 , array $data 用于修改的数据 , array $attrs 构造语句的属性
	 * @return int 被修改了多少行数据
	 */

	public function _update($table, $updateFields, $where, $data, $attrs) {
		$params = array(
			'ignore' => false,
			'table' => $table,
			'updateFields' => $updateFields,
			'where' => $where
		);
		foreach($attrs as $key => $val) {
			$params[$key] = $val;
		}
		$params['ignore'] = $params['ignore'] ? ' ignore ' : ' ';
		$params['table'] = ' ' . $params['table'] . ' ';
		$params['updateFields'] = ' ' . $params['updateFields'] . ' ';
		$params['where'] = empty($params['where']) ? '' : ' where ' . $params['where'] . ' ';
		//showMsg("update{$params['ignore']}{$params['table']}set{$params['updateFields']}{$params['where']}");
		$result = $this->_query("update{$params['ignore']}{$params['table']}set{$params['updateFields']}{$params['where']}", $data, 'LINE');
		return $result;
	}

	/**
	 * mysql中的执行函数
	 *
	 * 此函数将完城sql语句的执行与参数化查询
	 *
	 * @param string $sql SQL语句 , array $data 需要绑定的数据数组 , string $format 指定数据格式模板
	 * @return array 返回执行完成返回的数据
	 */

	protected function _query($sql, $data = array(), $format = 'AS-AL') {
		try {
			$result = array();
			$readySql = $this->db->prepare($sql);
			$result = is_null($data) ? $readySql->execute() : $readySql->execute($data);
			if($result == false) {
				return false;
			}
			else if(true) {
				$result = parent::fetch($readySql, $format);
			}
			return $result;
		}
		catch(PDOException $e) {
			parent::errorHandle('mysql', $e);
		}
	}

	/**
	 * 属性设置函数
	 *
	 * 此函数将能够为当前数据库实例设置属性值
	 *
	 * @param string $attrName 属性名称 , mixed $attrVal 属性值
	 * @return void 为当前数据库实例设置属性
	 */

	protected function _setAttr($attrName, $attrVal = null) {
		if(is_array($attrName)) {
			foreach($attrName as $key => $val) {
				$this->db->setAttribute($key, $val);
			}
			return;
		}
		$this->db->setAttribute($attrName, $attrVal);
	}
}